import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router/index'
// 创建一个新的axios实例
const service = axios.create({
  // 基地址
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  // 超时处理
  timeout: 5000 // request timeout
})

// 请求拦截器
service.interceptors.request.use(config => {
  // 请求发送时
  if (store.getters.token) {
    // 处理token超时处理
    // 主动介入处理
    if (Date.now() - localStorage.getItem('time') > 1000 * 60 * 60) {
      // 超过指定的时间实现退出登录的功能
      store.dispatch('user/logout')
      router.push('/login')
      // 返回一个信息，给相应拦截器接收，并弹窗提示
      return Promise.reject('登录超时（主动）')
    }
    // 如果有token就携带token发送请求
    config.headers.Authorization = `Bearer ${store.getters.token}`
  }
  // 无论如何都要返回放行
  return config// 必须返回配置
})
// 响应拦截器
service.interceptors.response.use(
  res => {
    // 请求成功
    if (res.data.success) {
      // 完全成功
      return res.data.data
    } else {
      // 请求有响应, 数据失败
    // 弹出错误提示
      Message.warning(res.data.message)
      // 阻止当前promise运行
      return Promise.reject(res.data.message)
    }
  },
  err => {
    // 注意这里写err.response &&是为了防止当err返回来的值没有response的情况下，不让他去判断后面的值，不然会报错
    if (err.response && err.response.data.code === 10002) {
      // 这里是被动处理token超时的
      // 和后端约定好的 10002
      // 超过指定的时间实现退出登录的功能
      store.dispatch('user/logout')
      router.push('/login')
      Message.error('登录超时（被动）')
    } else {
      // 完全错误
    // 这里是处理token超时啦，做个判断，需要弹窗的提示信息
    // 因为请求拦截器发送过来的信息是string
      Message.error(typeof err === 'string' ? err : '系统繁忙，请稍后尝试')
    }
    return Promise.reject(err)
  }
)

export default service
